Este projeto buscou dados encontrados na página da Câmara Municipal do Rio de Janeiro http://www.camara.rj.gov.br/.
Esta página disponibiliza diversas informações a respeito da produção e atividade dos veradores da cidade. Ela é atualizada sempre que necessário com todos os materiais das atividades das Sessões Plenárias.
A escolha desta página para análise foi motivada pela falta de recursos facilmente acessíveis para que a população acompanhe um resumo da atividade parlamentar do município do Rio de Janeiro.
As informações aqui apresentadas se referem à 10ª Legislatura, que compreende o os anos de 2017 a 2020.
Será apresentada a composição atual da Câmara Municipal, a frequência dos parlamentares e as atividades realizadas durante este período.
Em relação à atividade parlamentar, buscou-se informações a respeito de Projetos de Emenda à Lei Orgânica, Projetos de Lei Complementar, Projetos de Lei, Projetos de Decreto Legislativo, Projetos de Resolução, Indicações, Moções, Requerimentos de Informação e Requerimentos e Ofícios. Também foram coletadas as Leis Complementares e Emendas à Lei Orgânica que entraram em vigor no período especificado.
Em geral, todas as páginas coletadas para as Matérias Legislativas e Legislação Municipal apresentaram uma estrutura similar. Para exemplificar, irei apresentar a raspagem feita na página de Projetos de Lei.
O site oferece as informações organizadas por número, por ano, ou por autor. Como o interesse do projeto é buscar os dados por ano, para facilitar a filtragem do material desejado a raspagem foi realizada pela aba POR ANO para a maioria das matérias legislativas, excetuando-se algumas que apresentaram uma estrutura diferente das demais.
As páginas puderam ser acessadas com uma simples requisição GET, sem a necessidade de se incluírem parâmetros adicionais. A página principal de exibição dos resultados não nos mostra todos, sendo necessário ir clicando em “próximo” até se obter todos os resultados do ano desejado.
library(tidyverse)
## Warning: package 'tibble' was built under R version 4.0.3
library(rvest)
library(httr)
library(lubridate)
library(knitr)
## Warning: package 'knitr' was built under R version 4.0.3
library(kableExtra)
u_base <- "https://mail.camara.rj.gov.br/APL/Legislativos/scpro1720.nsf/Internet/LeiEmentaInt"
q_base <- list(
"OpenForm" = "",
"Start" = 1, # Número da página atual.
"Count" = 100, # Quantidade de resultados apresentados na página.
"Expand" = 1 # Índice do ano (Se descendente, 1 para 2020, 2 para 2019...)
)
get_materia <- GET(u_base, query = q_base)
O valor de Start para a troca de página segue uma lógica pouco intuitiva. No exemplo acima, a primeira página começa em 1, a seguinte é 1.99, depois 1.198, 1.297, 1.396, acrescentando 1 após o decimal e diminuindo 1 do último número. Para contornar este problema, optei por modificar o valor de Count para 1000, já que assim conseguiria que a página me retornasse todos os resultados e, verificando que nenhuma ano retornava mais do que 1000 resultados, esta solução foi suficiente para obter os dados desejados.
As informações a respeito dos Projetos de Lei e demais matérias são apresentadas no formato de tabela. Assim, foi feita uma leitura do html da página por meio da função xml2::read_html(get_materia), seguida de uma busca por todas as tabelas com xml2::xml_find_all('//table'):
read_html(get_materia) %>% # lê o html da página
xml_find_all('//table') %>% # busca os nodes do tipo table
magrittr::extract2(2) %>% # extrai o segundo node, que contém a tabela principal
html_table(fill = TRUE) %>% # leitura da tabela
janitor::clean_names() %>% # renomeia as colunas para um formato mais fácil de leitura e manipulação
select(c("x_2", "ementa", "data_publ", "autor_es")) %>% # seleciona apenas as colunas com as informações desejadas. o restante é 'lixo'
set_names(c("prolei_num", "ementa", "data_publi", "autores")) %>% # renomeia as colunas para nomes mais amigáveis
as_tibble() %>% # transforma o dataframe em tibble
separate_rows(autores, sep = ",") %>% # separa autores do projeto em uma linha para cada. a maioria está separada por "," mas ainda há alguns nomes separados por "E" e que devem ser corrigidos depois (não foram neste projeto)
filter(str_detect(ementa, "^[A-Z]")) %>% # verifica na coluna ementa apenas as linhas que começam por letras. Há linhas com NAs e o ano que não correspondem à observações com informações
mutate(data_publi = mdy(data_publi), # este mutate transforma a data de character
ementa = str_squish(ementa), # para date; elimina "sujeiras" no texto da
autores = str_to_title(autores), # ementa; torna maiúsculos apenas o nome e
autores = str_remove(autores, "(Vereador)(a*) ")) # sobrenome dos autores;
# e retira o título vereador/Vereadora da frente do nome.
# Estes dois últimos passos do mutate são importantes para unificar posteriormente
# este dataframe com o dataframe contendo as informações dos candidatos.
Para estas duas categorias foi necessário extrair os dados a partir da aba POR NÚMERO. Para o Projetos de Decreto Legislativo a aba POR ANO não retornava o nome do(s) autor(es) e para o Projeto de Resolução, o site direciona para a página de Projetos de Lei. O modo de requisição dos dados foi basicamente o mesmo. Sendo alterada apenas a iteração das páginas para Start ao invés de Expand. Como são poucas páginas com resultados, de forma não ideal, coletei manualmente os valores de Expand para cada página.
Os resultados da página de veradores atuais também estão dispostos no formato table, exigindo apenas uma busca para nodes deste tipo. No entanto, a foto e o partido dos veradores não é retornado na tabela principal, necessitando que fossem buscados de forma separada por meio da classe e fossem extraídas as informações desejadas contidas nos atributos
u_ver <- "http://www.camara.rj.gov.br/vereadores_atuais.php?m1=vereadores&m2=ver_atuais&m3=por_nome"
partidos <- read_html(u_ver) %>%
xml_find_all("//td[@class='td3']//img") %>%
xml_attr("title") %>%
str_squish()
foto_vereador <- read_html(u_ver) %>%
xml_find_all("//td[@class='td3']//img") %>%
xml_attr("src")
vereadores <- read_html(u_ver) %>%
xml_find_first('//table') %>%
html_table(header = TRUE) %>%
janitor::clean_names() %>%
as_tibble() %>%
mutate(partido = partidos,
foto = foto_vereador,
vereador = str_to_title(vereador))
A página de frequência dos vereadores é a que se diferencia um pouco mais das anteriores. Ela solicita uma requisição POST e os parâmetros de consulta são definidos em Request, em que os parâmetros variáveis são "ano" e "mes".
Obtida a página, os resultados são apresentados no formato de tabela, assim como nas demais. No entanto, o nome das colunas não é retornado na tabela obtida, sendo necessário buscá-los por meio da classe dos nodes: xml_find_all("//td[contains(@class, 'azul-claro')]
u <- "http://www.camara.rj.gov.br/vereadores_frequencia.php?m1=materias_leg&m2=freq"
# url base
b <- list(
"ano" = ano, # definido de forma numérica
"mes" = paste0(n_mes, "|", mes), # utiliza o formato (número do mês)|(nome do mês), por exemplo: "2|Fevereiro"
"sessao" = 1, # não muda
"submit" = "Consultar" # não muda; realiza a consulta
)
# Parâmetros do corpo da requisição
r <- POST(u, body = b)
t <- read_html(r) %>%
xml_find_first('//table') %>%
html_table(fill = TRUE)
faltas <- t %>%
as_tibble() %>%
set_names(xml_find_all(
read_html(r),
"//td[contains(@class, 'azul-claro')]") %>% # busca pelo título
html_text() %>% # das colunas, extrai o texto e "limpa" com
str_squish() # o str_squish()
) %>%
janitor::clean_names() %>%
slice(-1) %>% # elimina a primeira linha que não contém informações
mutate(ano = ano, # cria uma coluna com o ano da consulta
nome_mes = str_to_lower(mes), # cria uma coluna com o nome do mes da consulta e passa para lowercase
mes = n_mes, # cria uma coluna com o numero do mes da consulta
faltas = as.double(faltas),
faltas_abonadas = as.double(faltas_abonadas),
total_de_faltas = as.double(total_de_faltas))
# por fim, transforma as colunas com o numero de faltas em double
| foto | vereador | partido | sala | telefone | e_mail |
|---|---|---|---|---|---|
|
|
Alexandre Isquierdo | DEM | Anexo 803 | 3814-2406/2200/2220 | alexandreisquierdo@camara.rj.gov.br |
|
|
Átila A. Nunes | DEM | Anexo 706 | 3814-2136 / 2139 / 2010 | atila.nunes@camara.rj.gov.br |
|
|
Babá | PSOL | Anexo 903 | 3814-2429 | baba@camara.rj.gov.br |
|
|
Carlo Caiado | DEM | Anexo 1003 | 3814-2081 a 2083/2513/2514 | caiado@carlocaiado.com.br |
|
|
Carlos Bolsonaro | REPUBLICANOS | Anexo 905 | 3814-2117 a 2119 /2717 | carlosbolsonaro.rj@gmail.com |
|
|
Cesar Maia | DEM | Palácio 31-B | 3814-2331/2735/2485/2492/2592/2484/2476 | cesar.maia@uol.com.br |
|
|
Dr. Carlos Eduardo | PODE | Palácio 32-B | 3814-2328/2434/2490/2773/2469/2491 | dr.carloseduardo@camara.rj.gov.br |
|
|
Dr. Gilberto | PTC | Palácio 38-B | 3814-2131 / 2133 / 2134 | dr.gilberto@camara.rj.gov.br |
|
|
Dr. Jairinho | SOLIDARIEDADE | Anexo 406 | 3814-2147 / 2218 / 2296 / 2375 / 2376 | vereadorjairinho@terra.com.br |
|
|
Dr. João Ricardo | PSC | Anexo 802 | 3814-2246 / 2944 / 2418 | drjoaoricardo@camara.rj.gov.br |
|
|
Dr. Jorge Manaia | PROGRESSISTAS | Anexo 801 | 3814-2140/2143/2144/2563 | doutor@jorgemanaia.com.br |
|
|
Dr. Marcos Paulo | PSOL | Anexo 702 | 3814-2441 / 2444 / 2935 | contato@drmarcospaulo.com.br |
|
|
Eliseu Kessler | PSD | Anexo 904 | 3814-2102/2103/2105 /2050 | eliseukessler@camara.rj.gov.br |
|
|
Fátima Da Solidariedade | SOLIDARIEDADE | Anexo 701 | 3814-2176 / 2238 | fatima.solidariedade@camara.rj.gov.br |
|
|
Felipe Michel | PROGRESSISTAS | Anexo 705 | 3814-2069/2749/2901/2903/2905/ | felipe.michel@camara.rj.gov.br |
|
|
Fernando William | PDT | Anexo 1005 | 3814-2011/2157/2531/2543 | drfernadowilliam@gmail.com |
|
|
Inaldo Silva | REPUBLICANOS | Anexo 501 | 3814-2607/2609/2178 | vereadorinaldosilva@gmail.com |
|
|
Italo Ciba | AVANTE | Anexo 1004 | 3814-2158/2159/2162/2270 e 2034 | vereadoritalociba@gmail.com |
|
|
Jair Da Mendes Gomes | PROS | Anexo 305 | 3814-2231/2232/2456/2457 | jairdamendesgomes@gmail.com |
|
|
João Mendes De Jesus | REPUBLICANOS | Anexo 306 | 3814-2009 / 2057 / 2061 / 2333 | joaomendesdejesus@camara.rj.gov.br |
|
|
Jones Moura | PSD | Anexo 804 | 3814-2570/2571 | vereadorjonesmoura@gmail.com |
|
|
Jorge Felippe | DEM | Anexo 505 | 3814-2001 a 2004 / 2271 | jorge.felippe@camara.rj.gov.br |
|
|
Junior Da Lucinha | PL | Anexo 901 | 3814-2451/2455/2500/2669 | juniordalucinha@camara.rj.gov.br |
|
|
Leandro Lyra | REPUBLICANOS | Anexo 601 | 3814-2088/2089/2091 | leandrolyrarj@gmail.com |
|
|
Leonel Brizola | PSOL | Anexo 806 | 3814-2125/2180/2412 | leonelbrizola@camara.rj.gov.br |
|
|
Luciana Novaes | PT | Palácio 14-A | 3814-2511 e 2598. | mandato@vereadoraluciananovaes.com.br |
|
|
Luiz Carlos Ramos Filho | PMN | Anexo 504 | 3814-2005 / 2007 / 2387 | vereadorluizcarlosramosfilho@gmail.com |
|
|
Major Elitusalem | PSC | Anexo 604 | 3814-2498 / 2585 / 2237 / 2475 / 2043 | NA |
|
|
Marcelino D Almeida | PROGRESSISTAS | Anexo 602 | 3814-2183 a 2185/2448/2515 | marcelinodalmeida@gmail.com |
|
|
Marcello Siciliano | PROGRESSISTAS | Anexo 401 | 3814-2073/2179/2722 | escritoriosiciliano@hotmail.com |
|
|
Marcelo Arar | PTB | Anexo 506 | 3814-2030/2045/2046 | marceloarar@camara.rj.gov.br |
|
|
Paulo Messina | MDB | Anexo 404 | 3814-2545 | gabinete@messina.com.br |
|
|
Paulo Pinheiro | PSOL | Anexo 1002 | 3814-2393/2068/2920/2463 | paulopinheiro@camara.rj.gov.br |
|
|
Prof.célio Lupparelli | DEM | Anexo 906 | 3814-2036 à 2038 /2746/2760/2072 | celiolupparelli@globo.com |
|
|
Professor Adalmir | PROGRESSISTAS | Anexo 1006 | 3814-2086/2087/2170/2365 | prof.adalmir@camara.rj.gov.br |
|
|
Rafael Aloisio Freitas | CIDADANIA | Anexo 403 | 3814-2024 | rafael@rafaelaloisiofreitas.com.br |
|
|
Reimont | PT | Anexo 302 | 3814-2113 a 2115 / 2394 | reimont@reimont.com.br |
|
|
Renato Cinco | PSOL | Anexo 503 | 3814-2026 a 2029 / 2008 | renatocinco@renatocinco.com |
|
|
Renato Moura | PATRIOTA | Anexo 303 | 3814-2401/2461/2446/2449 | renato.moura@camara.rj.gov.br |
|
|
Rocal | PSD | Anexo 402 | 3814-2127 / 2128 / 2131 / 2442 | rogeriorocal@gmail.com |
|
|
Rosa Fernandes | PSC | Anexo 304 | 3814-2065 a 2067/2255 | rosa.fernandes@camara.rj.gov.br |
|
|
Tânia Bastos | REPUBLICANOS | Anexo 301 | 3814-2097 a 2099/2512 | vereadorataniabastos@camara.rj.gov.br |
|
|
Tarcísio Motta | PSOL | Anexo 902 | 3814-2330/2051 | contato@tarcisiomotta.com.br |
|
|
Teresa Bergher | CIDADANIA | Anexo 405 | 3814-2053/ 2054/ 2055/ 2056/ 2229/ 2389/ 2391 | teresa.bergher@camara.rj.gov.br |
|
|
Thiago K. Ribeiro | DEM | Anexo 1001 | 3814-2381/2383/2384 | atendimentotkr@gmail.com |
|
|
Vera Lins | PROGRESSISTAS | Anexo 606 | 3814-2187/2587/2579/2433 | veralins@camara.rj.gov.br |
|
|
Veronica Costa | DEM | Anexo 605 | 3814-2580 / 2590 | falecomveronicacosta@gmail.com |
|
|
Welington Dias | PDT | Anexo 502 | 3814-2070 / 2094 / 2497 | welington.dias@camara.rj.gov.br / gabinete@welingtondias.rio.br |
|
|
Willian Coelho | DC | Anexo 603 | 3814-2154 a 2156 | williancoelho@camara.rj.gov.br |
|
|
Zico | REPUBLICANOS | Anexo 805 | 3814-2167 a 2169/2172 | vereadorzico@camara.rj.gov.br |
|
|
Zico Bacana | PODE | Anexo 703 | 3814-2017 / 2078 / 2018 / 2019 | zicobacanaassessoria@gmail.com |
## Warning: package 'reactable' was built under R version 4.0.3
## Warning: 3 parsing failures.
## row col expected actual file
## 15362 -- 10 columns 1 columns 'atv_parlam_full.csv'
## 17633 -- 10 columns 1 columns 'atv_parlam_full.csv'
## 21802 -- 10 columns 1 columns 'atv_parlam_full.csv'